package com.ww.basic

object OptionTypeDemo {
  def main(args: Array[String]): Unit = {
    // 一、基础定义与结构
    // Option[A]是一个密封特质，有且仅有两个子类：
    // 1）Some[A]：包含具体值A的容器，例如Some("Tom")
    // 2）None：空值，例如None
    // Option的设计理念是将存在性（值是否存在）提升到类型层面，避免了空指针异常
    val maybeName: Option[String] = Option("Tom") // 存在值
    val missingName: Option[String] = None // 不存在值

    // 二、核心操作与方法
    // 1.安全访问值
    // getOrElse(default: A): A
    // 返回值或默认值，避免抛出异常
    val name = maybeName.getOrElse("Jerry") // Tom
    val emptyName = missingName.getOrElse("Jerry") // Jerry

    // fold[B](default: B)(f: A => B): B
    // 对存在的值应用函数f，否则返回default
    val length = maybeName.fold(0)(_.length) // 3
    val zero = missingName.fold(0)(_.length) // 0

    // 2.函数式转换
    // map[B](f: A => B): Option[B]
    // 对存在的值应用函数，返回新的Option
    val upper = maybeName.map(_.toUpperCase) // Some(TOM)
    val none = missingName.map(_.toUpperCase) // None

    // flatMap[B](f: A => Option[B]): Option[B]
    // 处理嵌套Option，例如解析可能为空的子值
    case class User(name: Option[String])
    val user = User(Some("Bob"))
    val userName = user.name.flatMap(name => Some(name + " Smith"))

    // 3.过滤与条件判断
    // filter(p: A => Boolean): Option[A]
    // 保留满足条件的值，否则返回None
    val longName = maybeName.filter(_.length > 5) // None

    // exists(p: A => Boolean): Boolean
    // 判断是否存在满足条件的值
    val hasLongName = maybeName.exists(_.length > 5) // false

    // 4.模式匹配
    // 通过match表达式显式处理两种情况
    maybeName match {
      case Some(name) => println(s"Hello, $name") // Hello, Tom
      case None => println("Hello, Stranger")
    }

    /**
     * 总结：
     * Option是Scala中处理空值的黄金法则，通过类型系统和丰富的方法集，提供了安全、优雅且高效的解决方案。
     * 熟练掌握map、flatMap、getOrElse和模式匹配，能显著提升代码的健壮性和可维护性。
     */
  }
}






































